package com.ck.redis;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class RedisDemoApplication
{
    public static void main( String[] args )
    {
        SpringApplication.run(RedisDemoApplication.class, args);
    }
}


/**
 * 补充：
 *  redis数据库主要由dict字典和expires字典组成
 *  dict字典：存储了所有键，每个键的指针指向值的引用地址。Redis对键值对的添加、删除、更新、查询操作都是基于键空间的基础上，先从dict字典查询出键，再根据键找到对应值进行操作
 *  expires字典：存储了键的过期时间，这个字典也称expires字典
 *
 *
 *内存回收策略：
 *  1-过期键删除策略：
 *   1、定时删除：对内存友好，对cpu不友好。会为设置过期时间的键创建一个定时器，使用定时器可以定时删除过期的键值对，释放出内存；但在大量定时器执行过程中会占用一部分CPU。如果在Redis的内存充沛但CPU非常紧张的业务场景下，此时定时器再执行，无疑会影响Redis的响应时间和吞吐量
 *   2、定期删除：每隔一段时间检查数据库中一部分的键，删除其中的过期键，该策略可以设置删除操作的执行时长和频率。它的缺点在于确认删除操作的执行时长和频率比较麻烦
 *   3、惰性删除：对内存不友好，可能会出现内存泄漏。 该策略会放任过期的键不管，直到每次获取键，如果发现键过期了，才会释放出键内存。如果在大量键没被访问的业务场景下，Redis内存会大量浪费在已过期的键上
 *   redis服务器实际上是采用了惰性删除策略、定期删除策略这两种策略配合使用。让服务器在避免CPU紧张和内存消耗过多之间取得平衡
 *
 *  2-内存淘汰策略：(做测试时可以用config set maxmemory 1GB命令设置内存上限)
 *   1、noeviction：默认策略不会删除任何键值对，同时会拒绝所有写命令。
 *   2、volatile-lru：根据LRU最近最少使用算法删除设置了过期时间的键，直到腾出足够的空间。如果没有可删除的键对象，则会回退到noeviction策略
 *   3、allkeys-lru：和volatile-lru同样的作用，不过针对的是所有键。
 *   4、allkeys-random：随机删除所有键，直到腾出足够的空间。
 *   5、volatile-random：随机删除过期键，直到腾出足够的空间。
 *   6、olatile-ttl：删除最近将要过期的键
 */
